<%@page import="jwj8508.j2ee.basic.projectv5.dao.BoardDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>JSTL : Java Standard Tag Library</title>
</head>
<body>
<h1>JSTL : Java Standard Tag Library</h1>
<h3>개요</h3>
<p>맵이나 List등의 컬렉션 항목 순회하기, 조건에 따라 실행, XML처리, DB 접근 및 조작등의
	일반적인 작업을 처리하는 사용자 정의 태그 라이브러리의 집합</p>
<p>jstl.java.net에서 API, implementation 모두 다운로드
	- 2014.01 기준 최신버전은 1.2.1(api), 1.2.2(impl)</p>
<p>다운로드 받은 jar파일은 WEB-INF/lib에 저장</p>
<p>JSP페이지에서 JSTL을 사용하려면 taglib 지시문 사용</p>

<h3>구성요소</h3>
<p>core : 변수지원, 흐름제어, URL 관리, 기타등등 - 접두사는 c</p>
<p>i18n : 로케일, 메세지/날짜/시간 형식지정  - 접두사는 fmt</p>
<p>functions : 다양한 문자처리용 함수 - 접두사는 fn</p>
<p>SQL : 다양한 SQL 작업용 라이브러리 - 접두사는 sql</p>
<p>XML : 기본적인 다양한 XML 작업용 라이브러리 - 접두사는 xml</p>

<h3>core</h3>
<p>out : 표현식을 평가하고 결과를 JspWriter로 출력<br />
	JSP 2.x 이상에서는 $&#123; }를 더 많이 사용<br />
	변수값을 xml escaping 해야하는 경우 여전히 out태그를 사용함(XSS 공격 방지)</p>
<p>set : 문자열 생성 및 유효범위내 변수 생성</p>
<p>remove : 변수 제거시 사용</p>
<p>if : </p>
<p>choose, when, default : </p>
<p>forEach : 반복 실행 또는 컬렉션을 순회<br />
	forEach 태그는 코드를 정해진 횟수만큼 반복해서 실행하거나 객체 컬렉션을 순회하는데 사용<br />
	var : 이 속성으로 만들어진 변수는 forEach가 실행중일때에만 유효함<br />
	forEach가 끝나면 이 변수도 소멸됨<br />
	varStatus 속성에는 count, last<br />
	forEach는 중첩이 가능</p>
	
<h3>형식화 태그</h3>
<p>formatDate : 날짜 출력</p>
<p>formatTime : 시간 출력</p>
<p>parseNumber : 숫자형태로 변환</p>
<p>parseDate : 날짜형태로 변환</p>

<h3>함수 태그 fn</h3>
<p>length(변수명) 문자 길이</p>
<p>substring(변수명, 시작위치, 끝위치) 문자 잘라냄</p>
<p>indexOf(변수명, 문자) 문자가 변수에 포함된 위치</p>
<p>escapeXml(html) : escaping 시킴</p>
<p>startsWith(변수명, 문자) : 변수가 문자로 시작하는지 boolean</p>
<p>endsWith(변수명, 문자) : 변수가 문자로 끝나는 boolean</p>
<p>contains(변수명, 문자) : 변수에 문자가 포함되어 있는지 boolean</p>
<p>split</p>
	
<hr />
<p><c:out value="라라라라라라라라라라라라라라" /></p>
<p><c:out value="${param.msg }" default="므화화화화화" /></p>
<p><c:out value="${param.msg }" escapeXml="true">라라라라랄라라</c:out></p>
<!--  11JSTL.jsp?msg=<a>12345</a> -->
<p><c:set var="uid" value="jwj8508" /> : ${uid }</p>
<p><c:set var="pwd">123456</c:set> : ${pwd }</p>
<p>
<jsp:useBean id="b" class="jwj8508.j2ee.basic.projectv5.model.BoardVO" />
<c:set target="${b }" property="title">123456abcdef</c:set>
${b.title }
</p>
<p><c:remove var="uid" /><c:remove var="pwd" />
	${uid } / ${pwd }</p>
<hr />
<p>
	<c:if test="${param.uid eq 'jwj8508' and param.pwd eq '123456' }">
		로그인 성공
	</c:if>
	<c:if test="${param.uid ne 'jwj8508' or param.pwd ne '123456'}">
		<h3 style="color: red;">로그인 실패</h3>
	</c:if>
</p>
<p>${(param.uid eq 'jwj8508' and param.pwd eq '123456')? "로그인성공" : "로그인실패" }</p>
<p>
	<c:choose>
		<c:when test="${param.type eq 'member' }">정회원입니다</c:when>
		<c:when test="${param.type eq 'guest' }">손님입니다</c:when>
		<c:otherwise>등록하세요</c:otherwise>
	</c:choose>
</p>
<hr />
<p>
	<!-- for(int i = 0; i < 10; ++i) {} -->
	<c:forEach var="i" begin="1" end="10" step="1">
		${i }
	</c:forEach>
	<br />
	<c:forEach var="b" items="<%=BoardDAO.listBoard() %>">
		${b.bdno } / ${b.title } / ${b.uid } <br />
	</c:forEach>
	<br />
	<c:forTokens var="item" items="a,b,c,d,e,f,1,2,3,4,5,6,7" delims=",">
		${item }
	</c:forTokens>
</p>
<hr />
<p>
	<fmt:formatNumber value="12" type="number" />
	<fmt:formatNumber value="12" type="number" minIntegerDigits="3" />
	<fmt:formatNumber value="12" type="number" minFractionDigits="2" />
	<fmt:formatNumber value="12.345" type="number" minFractionDigits="2" />
</p>
<p>
	<fmt:formatNumber value="123.4567" pattern=".00" />
	<fmt:formatNumber value="12365.4567" pattern="#,##00.0#" />
	<fmt:formatNumber value="123.40" pattern="#,##00.0#" />
	<fmt:formatNumber value="323.40" pattern="#,##00.00" />	
</p>
<p>
	<fmt:formatNumber value="111323.40" type="currency" />
	<fmt:formatNumber value="0.455" type="percent" />
</p>
<hr />
<jsp:useBean id="now" class="java.util.Date" />
<p>
	<fmt:formatDate value="${now }" /><br />
	<fmt:formatDate value="${now }" dateStyle="short" /><br />
	<fmt:formatDate value="${now }" dateStyle="medium" /><br />
	<fmt:formatDate value="${now }" dateStyle="long" /><br />
	<fmt:formatDate value="${now }" dateStyle="full" /><br />
</p>
<p>
	<fmt:formatDate value="${now }" type="time" /><br />
	<fmt:formatDate value="${now }" type="time" timeStyle="short" /><br />
	<fmt:formatDate value="${now }" type="time" timeStyle="medium" /><br />
	<fmt:formatDate value="${now }" type="time" timeStyle="long" /><br />
	<fmt:formatDate value="${now }" type="time" timeStyle="full" /><br />
</p>
<p>
	<fmt:formatDate value="${now }" type="both" dateStyle="full" timeStyle="long" /><br />
	<fmt:formatDate value="${now }" type="both" /><br />
	<fmt:formatDate value="${now }" type="both" dateStyle="medium" timeStyle="medium" />
</p>
<p>
	<fmt:formatDate value="${now }" type="both" pattern="yyyy-MM-dd" /><br />
	<fmt:formatDate value="${now }" type="both" pattern="a mm:ss" /><br />
</p>
<hr />
<p>
	<fmt:parseNumber var="no" type="number" value="${param.no }" />
	${no }
</p>
<p>
	<fmt:parseDate var="today" type="date" value="${param.today }" pattern="yyyy-MM-dd" />
	${today }<br />
	<fmt:parseDate var="today" type="date" value="${param.today }" pattern="yyyy-MM-dd" />
	<fmt:formatDate value="${today }" />
</p>
<hr />
<c:set var="jumin" value="850825-1234567" />
<c:set var="html" value="<h1>Hello, JSTL!</h1>" />
<c:set var="tokens" value="1,2,3,4,5,6,7" />
<p>
	jumin의 총 문자수 : ${fn:length(jumin) } <br />
	html의 총 문자수 : ${fn:length(html) } <br />
	tokens의 총 문자수 : ${fn:length(tokens) }
</p>
<p>
	성별체크 : ${fn:substring(jumin, 7, 8) } <br />
	생년월일 : ${fn:substring(jumin, 0, 6) } <br />
	생년월일 : <fmt:parseDate var="birth" type="date" value="${fn:substring(jumin, 0, 6) }" pattern="yyMMdd"/>
				<fmt:formatDate value="${birth }" pattern="yy년MM월dd일" />
</p>
<p>
	'-' 문자가 포함된 위치 : ${fn:indexOf(jumin, '-') }
</p>
<p>
	escaping 안된 태그 : ${html }
	escaping 된 태그 : ${fn:escapeXml(html) }
</p>
<p>
	'1'이라는 문자로 시작하는가? : ${fn:startsWith(tokens, '1') } <br /> 
	'7'이라는 문자로 끝나는가? :  ${fn:endsWith(tokens, '7') }
</p>
<p>
	'5'라는 문자가 있는가? : ${fn:contains(tokens, '5') }
</p>
<p>	
	<c:forEach var="t" items="${fn:split(tokens, ',') }">
		${t }
	</c:forEach>	
</p>
<p></p>
<p></p>
<p></p>

</body>
</html>